/**
 * 给定7*7的字符矩阵，有WB两种字母。如果有形如
 * B B
 *  B
 * B B
 * 的构型则称矩阵是不符合要求的。
 * 现在要把矩阵修改为符合要求，最少要改动几个B字母。
 * 虽然可以做成二分图，但不是标准问题。
 * 注意到可以直接分为两个独立的问题，因此最多只有12个X和25个字母
 * 直接暴力深搜，只需一个小优化即可。
 */  
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using vpii = vector<pii>;

template<typename T>
void input(vector<T> & v, int n){
	v.assign(n + 1, 0);
	for(int i=1;i<=n;++i) cin >> v[i];
	return;
}

int const DR[] = {-1, -1, 1, 1};
int const DC[] = {1, 1, -1, -1};

vpii get(int r, int c) {
	return {{r, c}, {r - 1, c - 1}, {r - 1, c + 1}, {r + 1, c - 1}, {r + 1, c + 1}}; 
}

int f(int r, int c){
    auto t = c + r * 7;
	t >>= 1;
	return t + 1;
}

pii g(int idx, int off=0){
	idx -= 1;
	idx <<= 1;
	return {idx / 7, idx % 7 + off};
}

vector<string> Board(7, string(7, ' '));
vector<vi> X2P;
vector<vi> P2X;

bool isOK(const vpii & v){
	for(const auto & p : v)if('B'!=Board[p.first][p.second])return false;
	return true;
}

int Ans;
vi Flag;
void dfs(int depth, int curAns){
	if(depth == 0){
		if(curAns < Ans) Ans = curAns;
		return;
	}

    for(auto i : X2P[depth]){
		if(Flag[i]){
			dfs(depth - 1, curAns);
		}else{
			if(curAns < Ans){ // 一个关键的小优化
				Flag[i] = 1;
				dfs(depth - 1, curAns + 1);
				Flag[i] = 0;				
			}
		}
	}
	return;
}

int proc(){
	P2X.assign(26, {});
	X2P.clear(); X2P.emplace_back(vi());   
	int r = 1, c = 1, o = 1;
	for(int i=1;i<=13;++i){
        auto ps = get(r, c);
		if(isOK(ps)){
			auto xidx = X2P.size();
			X2P.emplace_back(vi());

            for(const auto & p : ps){
				auto pidx = f(p.first, p.second);
				X2P[xidx].emplace_back(pidx);
				P2X[pidx].emplace_back(xidx);
			}
		}

		c += 2;
		if(c >= 6){
            c = o + 1;
			o ^= 1;
			r += 1;
		}
	}

#ifndef ONLINE_JUDGE
    cout << "OU\n";
    for(int i=1,n=X2P.size();i<n;++i){
		const auto & v = X2P[i];
		if(v.empty()) continue;
		cout << "X" << i << ":";
		for(const auto & p : v){
            auto pp = g(p);
			cout << "(" << pp.first << ", " << pp.second << ")";
		}
		cout << endl;
	}
#endif

    Ans = 10000;
	Flag.assign(30, 0);
    dfs(X2P.size() - 1, 0);
	auto ans = Ans;

	P2X.assign(25, {});
	X2P.clear(); X2P.emplace_back(vi());   

    r = 1, c = 2, o = 0;
	for(int i=1;i<=12;++i){
		// cout << r << ", " << c << endl;
		auto ps = get(r, c);
		if(isOK(ps)){
			auto xidx = X2P.size();
			X2P.emplace_back(vi());
            for(const auto & p : ps){
				auto pidx = f(p.first, p.second);
				X2P[xidx].emplace_back(pidx);
				P2X[pidx].emplace_back(xidx);
			}
		}

		c += 2;
		if(c >= 6){
            c = o + 1;
			o ^= 1;
			r += 1;
		}
	}	

#ifndef ONLINE_JUDGE
    cout << "JI\n";
    for(int i=1,n=X2P.size();i<n;++i){
		const auto & v = X2P[i];
		if(v.empty()) continue;
		cout << "X" << i << ":";
		for(const auto & p : v){
            auto pp = g(p, 1);
			cout << "(" << pp.first << ", " << pp.second << ")";
		}
		cout << endl;
	}
#endif

    Ans = 100000;
	Flag.assign(30, 0);
	dfs(X2P.size() - 1, 0);
    ans += Ans;
	return ans;
}

void work(){
    for(auto & s : Board) cin >> s;
	cout << proc() << "\n";
    return;
}

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int nofkase = 1;
    cin >> nofkase;
    while(nofkase--) {
		work();
	}
    return 0;
}